"""
# 函数
# 函数是组织好的，可重复使用，实现单一或者相关功能的代码段，能够提高应用的模块性和重复利用率。我们知道Python内置了很多函数供我们调用

# 定义一个函数
# 函数开头是----def,格式：def function()
# 任何函数传入的参数或者变量都应该在 def function() 这个括号里面
# 函数的第一行尽量写上注释，来说明函数功能
# 函数是以：开始，函数如果有返回值，就以return返回
"""
"""
a = 1
b = 3

def add(a,b):
    # 该函数的功能就是返回两个数相加
    return a+b

print(add(2,6))
print(add(5,6))
print(add(2,3))
"""
"""
# 函数有无参函数、有参函数
# 无参函数：没有参数传递
def get_default_server():
    return "192.168.1.2"

print(get_default_server())

# 有参函数：有参数传递

def speak_out(money,name):
    print(f"我的名字叫{name}，拥有{money}块钱！")
speak_out(1000,"廖th")

# 不可变函数
def chage_num(num):
    print("num", num)
    num = 10
    print("num", num)

a = 19
print("a",a)
chage_num(a)
print("a",a)
"""
"""
# id(x)就是打印变量X在内存中的地址
# 不可变参数的原因是 由于参数在传递过程中进行了对象拷贝，参数已经被赋值给了另外一个对象 在函数里面修改参数是无效的
def chage_num(num):
    print(f"num:{num}，id{id(num)}")
    num = 10
    print(f"num:{num}，id{id(num)}")

a = 19
print(f"a:{a}，id{id(a)}")
chage_num(a)
print(f"a:{a}，id{id(a)}")

"""
"""
#可变函数
def chage_list(list):
    print(f"list_id:{id(list)}")
    list[0] = 1

var_list = [3,4,5,6]
print(f"list_id:{id(var_list)}")
print(var_list)
chage_list(var_list)
print(f"list_id:{id(var_list)}")
print(var_list)

# 在Python中，不可变参数有int float str 元组
# 在Python中，可变参数有list dict-字典 自己定义的class (homework)
"""

# 传递的参数有不定长参数，就是传递的参数个数是不确定的，3，4，5等等
# 当参数中有*开头的就是不定长参数 def function(a, *b)
"""
def unconfirm_val(a, *b):
    print(f"a:{a}")
    # print(f"a:{a},type_a{type(a)}")
    print(f"b:{b}")

unconfirm_val(1,2,3,4,5,6)
unconfirm_val(1,2,3,4,5,6,8,8,8,8)
"""
"""
# 如果说 **b ,b会以字典的方式传递进来
def unconfirm_val(a, **b):
    print(f"a:{a}")
    # print(f"a:{a},type_a{type(a)}")
    print(f"b:{b}")
    print(f"b:{b},type_a{type(b)}")

unconfirm_val(1,x=2,y=3,z=456)
unconfirm_val(1,x=2,y=3,z=49998)
"""
# 默认参与函数
# 当调用方不传递参数时候，默认使用的参数
"""
def default_val(name = "廖th",money = 100):
    print(f"name:{name},money:{money}")

default_val()
default_val(name="查无此人",money=200000)
"""

# 关键字参数
# 在Python中，参数和函数的关系是非常紧密的，如何保证传入的参数和调用的参数保持一致，那么就要使用关键字参数（经常用到）
"""
def print_me(name,age):
    print(f"我的名字叫做{name}，今年{age}岁！")

print_me("廖th",22)
print_me(age=22,name="廖th")

"""
"""
def print_me(name:str, age:str) ->str:
#     return "我的名字叫" + name + "今年" + age + "岁！"
# print(print_me("廖th","18"))
    print("我的名字叫" + name + "今年" + age + "岁！")
    return "10000"
print("返回值：" + print_me("廖th","22"))
# print(print_me("廖th","22"))
"""

# 实现max 传入一个list 返回这个list 中最大的元素
"""
def max_value_for_list(list_val:list)->int:
    max_value : int = 0
    for item in list_val:
        if item > max_value:
            max_value = item
    return max_value

print(f"Max Value: {max_value_for_list([1,2,3,44,555,678,8,999,12345])}")

"""

# 函数的嵌套使用
"""
def fun_a():
    print("fun_a")
def fun_b():
    fun_a()
    print("fun_b")
fun_b() #调用函数
"""

# 函数是可以作为函数的参数被传入的，函数是可以 当做参数的
"""
def fun_val(a,b):
    return a + b

def call_fun(a, funb):
    print(f"a:{a}")
    print(f"run func: {funb(a,10)}")

call_fun(1,fun_val)
"""
"""
# 函数是可以自己调用自己的
def func_call_self(a):
    # if a == 5:
    #     print(f"a = {a}")
    if a == 0:
        print(f"a = {a}")
    else:
        # print(f"a = {a}")
        # a = a+1
        # func_call_self(a)# 自己调自己，递归
        print(f"a = {a}")
        a = a - 1
        func_call_self(a)

# func_call_self(0)
func_call_self(9)
"""


def sort_list_descending(lst):
    # 使用sorted函数进行排序，reverse=True表示降序
    return sorted(lst, reverse=True)

print(sort_list_descending([3,4,1,3,5,7,9]))

